/*
*
*
* 1.串行执行:   job1.then(job2).then(job3).catch(handleError);
* 2.除了串行执行若干异步任务外，Promise还可以并行执行异步任务。
* 3.有些时候，多个异步任务是为了容错。比如，同时向两个URL读取用户的个人信息，只需要获得先返回的结果即可。这种情况下，用Promise.race()  --> 由于p1执行较快，Promise的then()将获得结果'P1'。p2仍在继续执行，但执行结果将被丢弃
*
*
* 更多Promise使用方式: https://segmentfault.com/a/1190000016848192
* */









// setTimeout会异步执行
// function callback(){
//     console.log('callback')
// }
//
// console.log('before setTimeout')
// setTimeout(callback, 1000)
// console.log('after setTimeout')
// output:
// before setTimeout
// after setTimeout
// callback

// Promise有各种开源实现，在ES6中被统一规范，由浏览器直接支持

function test(resolve, reject) {
    var timeOut = Math.random() * 2
    console.log('set timeout to ' + timeOut + ' seconds')
    setTimeout(function () {
        if (timeOut < 1) {
            console.log('call resolve')
            resolve('200 ok')
        } else {
            console.log('call reject()')
            reject('timeout in ' + timeOut + ' seconds')
        }
    })
}

// var p1 = new Promise(test)
// var p2 = p1.then(function (result) {
//     console.log('成功:' + result)
// })
// var p3 = p2.catch(function (reason) {
//     console.log('失败: ' + reason)
// })

// new 实例创建的时候, 会立即执行
// const promise = new Promise((resolve, reject) => {
//     console.log(1);
//     resolve();
//     console.log(2);
// })
//
// promise.then(() => {
//     console.log(3);
// })
//
// console.log(4);
// output:
// 1
// 2
// 4
// 3

const promise = new Promise((resolve, reject) => {
    // 直行道其中一个的时候, 就会马上传递出去, 不会执行后面的操作
    // resolve('success1');  // 将执行成功, 将异步执行的结果,作为参数传递出去
    // reject('error')  // 执行失败, 将异步执行的结果,作为参数传递给catch
    resolve('success2')
})
promise.then((res) => {
    console.log('then', res)
}).catch((err) => {
    console.log('catch', err)
})